#pragma once
#include "noncopyable.h"
#include "Socket.h"
#include "Channel.h"

#include <functional>

class EventLoop;
class InetAddress;
/**
 * Acceptor类
 * 描述
 *      IO线程, 即base_io管理, IO线程只负责监听新连接的到来, 之后分配个工作线程,
 *      工作线程负责连接, 逻辑处理.
 *      新连接事件的触发回调由IO线程设置回调函数,
 *      同时, Acceptor的回调函数以及关注的事件会被注册在他的成员变量channel上,
 *      然后, 再将channel注册在Acceptor所属的loop的POLLER上, 即内核epoll事件表中
 *      当事件触发, loop自动回调channel上的回调函数
 *
 *      开启监听, 仍然是Socket成员变量来
 *      事件触发, 是通过Acceptor所属的loop的
 * 接口
 *      setNewConnectionCallback 设置回调函数
 *
 *
 */

class Acceptor : noncopyable
{
public:
    using NewConnectionCallback = std::function<void(int sockfd, const InetAddress&)>;
    Acceptor(EventLoop *loop, const InetAddress &listenAddr, bool reuseport);
    ~Acceptor();

    void setNewConnectionCallback(const NewConnectionCallback &cb) 
    {
        newConnectionCallback_ = cb;
    }

    bool listenning() const { return listenning_; }
    void listen();
private:
    void handleRead();
    
    EventLoop *loop_; // Acceptor用的就是用户定义的那个baseLoop，也称作mainLoop
    Socket acceptSocket_;
    Channel acceptChannel_;
    NewConnectionCallback newConnectionCallback_;
    bool listenning_;
};